package observe_pattern.ex1;

import java.util.ArrayList;
import java.util.Random;

/**
 * @author 申书航
 * @version 1.0
 * 游戏核心类，负责游戏逻辑的实现和管理
 */
public class GameCore {

    private final ArrayList<Role> camp1;

    private final ArrayList<Role> camp2;


    /**
     * 构造函数，初始化游戏核心类并调用初始化方法
     */
    public GameCore() {
        camp1 = new ArrayList<>(3);
        camp2 = new ArrayList<>(3);
        init();
    }

    /**
     * 初始化阵营角色的方法
     * @param cureSkill 治疗技能
     * @param hurtSkill 伤害技能
     * @param random 随机数生成器
     * @param name 阵营名称
     * @param camp 阵营编号
     * @param campList 存储角色的列表
     */
    private void initCamp(CureSkill cureSkill, HurtSkill hurtSkill, Random random,
                         String name, int camp,ArrayList<Role> campList) {
        for (int i = 1; i <= 3; i++) {
            Role role = new Role(name + i, camp, 500);
            // 设置技能
            if (random.nextBoolean()) {
                role.setSkill(cureSkill);
            }
            else {
                role.setSkill(hurtSkill);
            }
            // 注册角色到技能中
            hurtSkill.addTargets(role);
            cureSkill.addTargets(role);
            campList.add(role);
        }
    }

    /**
     * 初始化方法，负责创建技能和角色
     */
    private void init() {
        // 初始化技能
        CureSkill cureSkill = new CureSkill();
        HurtSkill hurtSkill = new HurtSkill();
        // 初始化角色
        Random random = new Random();
        initCamp(cureSkill, hurtSkill, random, "红", 1, camp1);
        initCamp(cureSkill, hurtSkill, random, "蓝", 2, camp2);
    }

    /**
     * 移除阵营中已死亡的角色
     * @param camp 阵营角色列表
     */
    private void removeDead(ArrayList<Role> camp) {
        for (int i = 0; i < camp.size(); ) {
            if (camp.get(i).getHp() <= 0) {
                camp.remove(i);
                continue;
            }
            i++;
        }
    }

    /**
     * 进行战斗的方法，模拟两个阵营之间的战斗
     */
    public void fight() {
        int campIndex1 = 0;
        int campIndex2 = 0;

         do {
            camp1.get(campIndex1).useSkill();
            camp2.get(campIndex2).useSkill();

            removeDead(camp1);
            removeDead(camp2);

            campIndex1 = (campIndex1 + 1) % camp1.size();
            campIndex2 = (campIndex2 + 1) % camp2.size();
        } while (camp1.isEmpty() || camp2.isEmpty());
    }

    /**
     * 主方法，程序入口
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        GameCore gameCore = new GameCore();
        gameCore.fight();
    }
}
